package commons.drawing.couche;

import commons.data.I_Data;
import commons.data.I_Data.DataType;
import commons.drawing.I_Drawable;
import commons.utils.primitive_geom.Rect_d;
import java.util.ArrayList;
import java.util.Collections;


// Couche standard, basée sur un I_Data
// Le type d'objet est identifié par un dataType
// Le I_Data pouvant renvoyer les données selon ce dataType et le rectangle de visu
public class CoucheBasic extends A_Couche {

	protected DataType dataType;
	protected I_Data data;
	protected boolean bNeedSort; // tri avant affichage ? (cf. le SPI change l'ordre des éléments)
	protected int nbMaxObjectToDraw; // si trop d'objet a afficher, n'affiche rien, si <0 (par defaut), affiche toujours tout

	public CoucheBasic(String name, DataType dataType, I_Data data) {
		this(name, dataType, data, false, -1);
	}

	public CoucheBasic(String name, DataType dataType, I_Data data, boolean bNeedSort) {
		this(name, dataType, data, bNeedSort, -1);
	}

	public CoucheBasic(String name, DataType dataType, I_Data data, boolean bNeedSort, int nbMaxObjectToDraw) {
		super(name);

		this.dataType = dataType;
		this.data = data;
		this.bNeedSort = bNeedSort;
		this.nbMaxObjectToDraw = nbMaxObjectToDraw;
	}


	@Override
	protected ArrayList<I_Drawable> getDrawables(Rect_d rectVisu) {
		assert(dataType!=null); // si null, c'est que getDrawable DOIT etre overriden !! -> on ne doit pas passer par là
		ArrayList v = data.getData(dataType, rectVisu);

		// pas d'affichage si trop d'objets affichés et que rectVisu non null (si null, l'appel vient surement de la fonction search -> il faut tout renvoyer)
		if (nbMaxObjectToDraw >= 0 && v.size() > nbMaxObjectToDraw && rectVisu!=null)
			return null;

		if (bNeedSort) {
			if (v.size()>0)
				assert (v.get(0) instanceof Comparable);
			Collections.sort(v);
		}

		return v;
	}
}
